package com.lingjtx.common.redis.service;

import com.lingjtx.common.core.RedisOptions;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.Map;
import java.util.Set;

/**
 * 常用redis命令操作，key（redis key 和 HashKey）统一为String类型，value 为Object任意对象
 * value 采用Jackson2JsonRedisSerializer序列化存储
 */
public interface IRedisService extends RedisOptions {

    // 返回 key 所储存的值的类型
    DataType type(String key);

    /**
     * Redis HSCAN 命令用于迭代哈希表中的键值对。HSCAN key cursor [MATCH pattern] [COUNT count]
     * cursor - 游标。
     * pattern - 匹配的模式。
     * count - 指定从数据集里返回多少元素，默认值为 10 。
     * Important: Call {@link Cursor#close()} when done to avoid resource leak
     * @param key
     * @param options
     * @return 返回的每个元素都是一个元组，每一个元组元素由一个字段(field) 和值（value）组成。
     */
    Cursor<Map.Entry<String, Object>> hmScan(String key, ScanOptions options);

    /**
     * Redis Sscan 命令用于迭代集合中键的元素
     * SSCAN key cursor [MATCH pattern] [COUNT count]
     * Important: Call {@link Cursor#close()} when done to avoid resource leak
     * cursor - 游标。
     * pattern - 匹配的模式。
     * count - 指定从数据集里返回多少元素，默认值为 10 。
     * @param key
     * @param options
     * @return 数组列表
     */
    Cursor<Object> sScan(String key, ScanOptions options);

    Long zAdd(String key, Set<ZSetOperations.TypedTuple<Object>> tuples);

    Set<ZSetOperations.TypedTuple<Object>> zRangeWithScores(String key, long start, long end);

    Set<ZSetOperations.TypedTuple<Object>> zRangeByScoreWithScores(String key, double min, double max);

    Set<ZSetOperations.TypedTuple<Object>> zRangeByScoreWithScores(String key, double min, double max, long offset, long count);


    Set<ZSetOperations.TypedTuple<Object>> zReverseRangeWithScores(String key, long start, long end);

    Set<ZSetOperations.TypedTuple<Object>> zReverseRangeByScoreWithScores(String key, double min, double max);

    Set<ZSetOperations.TypedTuple<Object>> zReverseRangeByScoreWithScores(String key, double min, double max, long offset, long count);

    /**
     *Zscan 命令用于迭代有序集合中的元素（包括元素成员和元素分值）ZSCAN key cursor [MATCH pattern] [COUNT count]
     * cursor - 游标。
     * pattern - 匹配的模式。
     * count - 指定从数据集里返回多少元素，默认值为 10 。
     * @param key
     * @param options
     * @return 返回的每个元素都是一个有序集合元素，一个有序集合元素由一个成员（member）和一个分值（score）组成
     */
    Cursor<ZSetOperations.TypedTuple<Object>> zScan(String key, ScanOptions options);
}
